package cn.xiaolang.function.java_gc;

import cn.xiaolang.common.utils.Monitor;

/**
 * 标记对象是否存活--引用计数法
 *
 * <p>
 * 引用计数法实现简单，判定高效，但不能解决对象之间相互引用的问题
 * 示例：相互引用，依然被回收啦
 * </p>
 *
 * <p>
 * 运行参数:
 * -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xms50M -Xmx50M -Xmn30M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=10
 * </p>
 *
 * <p>
 * -XX:+PrintGC 输出GC日志
 * -XX:+PrintGCDetails 输出GC的详细日志
 * -XX:+PrintGCTimeStamps 输出GC的时间戳（以基准时间的形式）
 * -XX:+PrintGCDateStamps 输出GC的时间戳（以日期的形式，如 2013-05-04T21:53:59.234+0800）
 * -XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
 * -Xloggc:../logs/java_gc.log 日志文件的输出路径
 * </p>
 *
 * @author fuhw/DeanKano
 * @date 2018-08-22
 */
@SuppressWarnings("unused")
public class MarkObjAliveByCountDemo {

    private Object instance = null;
    // 一个对象占10M，方便在GC日志中看出是否被回收
    private byte[] bigSize = new byte[Monitor.MB * 10];

    public static void main(String[] args) throws InterruptedException {

//		TimeUnit.SECONDS.sleep(15);
        MarkObjAliveByCountDemo objA = new MarkObjAliveByCountDemo();
        MarkObjAliveByCountDemo objB = new MarkObjAliveByCountDemo();

        objA.instance = objB;
        objB.instance = objA;

        System.gc();

    }
}